/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package API_Systeme.Proxy;

import API_Db.API_Db_Compte;
import API_Db.API_Db_Seance;
import domain.Observer.Seance;
import domain.Utilisateur;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *Proxy gerant les actions pour lesquel il faut remplir certaines conditions
 * @author Wan
 */
public class Proxy implements IAPI_Systeme_Proxy {

    private API_Systeme_Seance API_Sys_S = new API_Systeme_Seance();
    private API_Db_Seance API_Db_S = new API_Db_Seance();

    @Override
    public void quitterSeance(int id_seance, int id_utilisateur) throws Exception {
        if (API_Db_S.getMeilleurEncherisseurDB(id_seance).getIdUtilisateur() == id_utilisateur) {
            throw new Exception("Impossible de quitter la seance, l'utilisateur est le meilleur encherisseur");
        } else {
            API_Sys_S.quitterSeance(id_seance, id_utilisateur);
        }
    }
    //TODO Encoder toutes les chaines ajoutee a la base

    @Override
    public void posterMessage(int id_seance, int id_utilisateur, String message) throws Exception {
        if (API_Db_S.participeASeance(id_seance, id_utilisateur) || API_Db_S.getSeanceById(id_seance).getId_vendeur() == id_utilisateur) {
            API_Sys_S.posterMessage(id_seance, id_utilisateur, message);
        } else {
            throw new Exception("L'utilisateur ne participe pas à la seance");
        }
    }

    @Override
    public void encherir(int id_seance, int id_utilisateur, double prix) throws Exception {
        Seance s = API_Db_S.getSeanceById(id_seance);
        if (API_Db_S.participeASeance(id_seance, id_utilisateur)) {
            if (s.getId_vendeur() != id_utilisateur) {
                double prixMin = API_Sys_S.getEnchereSuivante(id_seance);
                System.out.println("prix min = " + prixMin);
                if (prix > prixMin) {

                    API_Db_Compte api_db_c = new API_Db_Compte();

                    Utilisateur meilleur = API_Db_S.getMeilleurEncherisseurDB(id_seance);
                    double lastMeilEnchere = API_Db_S.getMeilleurEnchereDB(id_seance);

                    //Debiter avant crediter ancien meilleur encherisseur
                    //car cela declenche l exception au cas ou il n a pas asse de credit
                    Double soldeActuel = 0.00;
                    Double soldeFutur = 0.00;
                    soldeActuel = api_db_c.getSoldeCompteDB(id_utilisateur);

                    if (soldeActuel == -1) {
                        throw new Exception("Le compte de l'utilisateur n'existe pas");
                    }

                    soldeFutur = soldeActuel - prix;

                    if (soldeFutur < 0.00) {
                        throw new Exception("Solde de crédit insufisant");
                    }

                    api_db_c.debiterCompteDB(id_utilisateur, prix);
                    if (meilleur != null) {
                        api_db_c.crediterCompteDB(meilleur.getIdUtilisateur(), lastMeilEnchere);
                    }
                    API_Sys_S.encherir(id_seance, id_utilisateur, prix);
                } else {
                    throw new Exception("Le montant saisi n'est pas suffisant ( minimum = " + prixMin + " )");
                }
            } else {
                throw new Exception("L'utilisateur est le vendeur");
            }
        } else {
            throw new Exception("L'utilisateur ne participe pas à la seance");
        }
    }

    public static void main(String[] args) {
        IAPI_Systeme_Proxy api = new Proxy();
        API_Systeme_Seance apiSeance = new API_Systeme_Seance();
        try {
            //apiSeance.rejoindeSeance(20, 18);
            api.encherir(20, 18, 12.0);
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }
}